# Copyright (c) 2024, 2025, Oracle and/or its affiliates.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License, version 2.0,
# as published by the Free Software Foundation.
#
# This program is designed to work with certain software (including
# but not limited to OpenSSL) that is licensed under separate terms,
# as designated in a particular file or component or in included license
# documentation.  The authors of MySQL hereby grant you an additional
# permission to link the program and your derivative works with the
# separately licensed software that they have either included with
# the program or referenced in the documentation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License, version 2.0, for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA

if(DEFINED pattern)
  file(GLOB_RECURSE binaries "${pattern}")
else()
  string(REPLACE " " ";" binaries "${binaries}")
endif()

FOREACH(bin ${binaries})
  # the /usr/local/mysql/lib/ is present in dependencies of Kerberos libraries
  # built in PB2
  SET(pattern "@executable_path|@loader_path|/usr/local/mysql/lib/")

  IF(NOT bin MATCHES "${CRYPTO_VERSION}")
    STRING(APPEND pattern "|${CRYPTO_VERSION}")
  ENDIF()

  IF(NOT bin MATCHES "${OPENSSL_VERSION}")
    STRING(APPEND pattern "|${OPENSSL_VERSION}")
  ENDIF()

  MESSAGE(STATUS "  checking: ${bin}")
  EXECUTE_PROCESS(COMMAND otool -L ${bin} OUTPUT_VARIABLE COMMAND_OUTPUT)

  STRING(REGEX MATCHALL "[^ \t]+[ \t]" TOKENS ${COMMAND_OUTPUT})

  FOREACH(TOKEN ${TOKENS})
    STRING(STRIP "${TOKEN}" TOKEN)

    IF(TOKEN MATCHES "${pattern}")
      SET(ENTRY "${TOKEN}")
      STRING(FIND "${ENTRY}" "/" POS REVERSE)

      IF(POS EQUAL -1)
        SET(LIB "${ENTRY}")
      ELSE()
        MATH(EXPR POS "${POS} + 1")
        STRING(SUBSTRING "${ENTRY}" ${POS} -1 LIB)
      ENDIF()

      MESSAGE(STATUS "    replacing: ${ENTRY}")
      EXECUTE_PROCESS(COMMAND install_name_tool -change
          "${ENTRY}" "@rpath/${LIB}"
          ${bin} RESULT_VARIABLE COMMAND_RESULT)

      IF("${COMMAND_RESULT}" STREQUAL "1")
        MESSAGE(FATAL_ERROR "Failed resetting dynamic library ${LIB} to bundled one on ${bin}.")
      ENDIF()
    ENDIF()
  ENDFOREACH()

  EXECUTE_PROCESS(COMMAND otool -L ${bin})
  MESSAGE(STATUS "  done: ${bin}")
ENDFOREACH()
